;##################################
;命令：
;nasm -f elf64 day5_0vector_0multiply_1vector_multiply_scalar.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;Value in arr[0] is 5.
;Value in arr[1] is 10.
;Value in arr[2] is 15.
;Value in arr[3] is 20.
;##################################
extern printf

section .data
	msg: db `Value in arr[%d] is %d.\n`, 0
;######################################
	align 16
	arr0: dd 1, 2, 3, 4
	align 16
	arr1: dd 5
;######################################
section .text
	global main

main:
	push rbp
	mov rbp, rsp

;#################################################################
	;请注意：
	;向量乘以标量的运算
	;是先将标量扩展成为向量
	;然后再进行向量乘以向量的运算

	vmovdqa xmm0, [arr0]

	;将一个int数扩展成向量
	;将一个int数扩展成4个重复的int数
	;xmm0有128位，int有32位
	;一个xmm0最多可包含4个int数
	;Load with Broadcast Floating-Point Data
	vbroadcastss xmm1, [arr1]

	vpmulld xmm0, xmm0, xmm1
	vmovdqa [arr0], xmm0
;#################################################################

	;用for循环进行打印
	mov ebx, 0
	jmp compare

execute:
	mov rdi, msg
	movsxd rsi, ebx
	movsxd rdx, dword [arr0 + 4 * ebx]
	call printf

	inc ebx

compare:
	cmp ebx, 4
	jl execute

	mov eax, 0
	leave
	ret
